package com.own.component.util.excel.util.read.base;

import com.own.component.util.excel.util.read.model.ResolveFileModel;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.InputStream;
import java.util.List;

/**
 * AbstractExcelRead
 *
 * @author chenxueli
 * @date 2022-09-23 10:33:44
 */
public abstract class AbstractExcelRead<T, FUN extends BaseFunction, CONFIG extends BaseExcelReadConfig<T>> extends AbstractParentExcelMethod<T, CONFIG> {

    /**
     * 读取excel内容
     *
     * @param file            文件
     * @param resolveFunction 解析数据的方法
     * @return 解析后的内容信息
     */
    public final List<T> read(MultipartFile file, FUN resolveFunction) {
        return read(new ResolveFileModel(file), resolveFunction);
    }

    /**
     * 读取excel内容
     *
     * @param path            文件路径
     * @param resolveFunction 解析数据的方法
     * @return 解析后的内容信息
     */
    public final List<T> read(String path, FUN resolveFunction) {
        return read(new ResolveFileModel(path), resolveFunction);
    }

    /**
     * 读取excel内容
     *
     * @param file            文件
     * @param resolveFunction 解析数据的方法
     * @return 解析后的内容信息
     */
    public final List<T> read(File file, FUN resolveFunction) {
        return read(new ResolveFileModel(file), resolveFunction);
    }

    /**
     * 读取excel内容
     *
     * @param inputStream     文件流
     * @param resolveFunction 解析数据的方法
     * @return 解析后的内容信息
     */
    public final List<T> read(InputStream inputStream, FUN resolveFunction) {
        return read(new ResolveFileModel(inputStream), resolveFunction);
    }

    /**
     * 读取excel内容
     *
     * @param fileModel       文件信息
     * @param resolveFunction 解析数据的方法
     * @return 解析后的内容信息
     */
    public abstract List<T> read(ResolveFileModel fileModel, FUN resolveFunction);

    /**
     * 设置读取配置信息
     *
     * @param config 配置信息
     * @return this
     */
    public AbstractExcelRead<T, FUN, CONFIG> config(CONFIG config) {
        super.setCurrentConfig(config);
        return this;
    }

}
